﻿#ifndef WRWORKTCPCOMMDOMAIN
#define WRWORKTCPCOMMDOMAIN

#include "WRWorkDomain.h"
#include <QHostAddress>

//工作TCP通讯域类标识。 {AC7B4995-89FF-4C6C-BB62-A4910CB121B7}
#define WRWorkTcpCommDomainClass QUuid(0xac7b4995, 0x89ff, 0x4c6c, 0xbb, 0x62, 0xa4, 0x91, 0xc, 0xb1, 0x21, 0xb7)
//工作TCP通讯域字符数组 WRWorkFileConfigProvider
#define WRWorkTcpCommDomainStrArr  {'W', 'R', 'W', 'o', 'r', 'k', 'T', 'c', 'p', 'C', 'o', 'm', 'm', 'D', 'o', 'm', 'a', 'i', 'n'}
//工作TCP通讯域字符个数
#define WRWorkTcpCommDomainStrLen  19

//声明工作TCP通讯客户端例程。
class WRWorkTcpCommClientRoutine;
//声明工作TCP通讯客户端上下文。
class WRWorkTcpCommClientContext;

//表示工作TCP域。
class WRWorkTcpCommDomain : public WRWorkDomain
{
    friend class WRWorkTcpCommClientRoutine;

private:
    //上下文对象。
    static WRWorkTcpCommClientContext* _ctx;

    //服务地址。
    QHostAddress m_addr;
    //服务端口。
    WR16u m_port;
    //是否自启。
    bool m_autostart;
    //通讯例程。
    WRWorkTcpCommClientRoutine* m_routine;

protected:
    //当加载后执行相应的初始工作。
    virtual void onInit(void) override;
    //当删除前执行相应的清理工作。
    virtual void onFree(void) override;

    //当状态改变后调用此方法。
    inline void onChanged(Status status, WRWorkSession* session = 0)
    {
        WRWorkDomain::onChanged(status, session);
    }

public:
    //初始化TCP通讯域。
    WRWorkTcpCommDomain(const WRWorkInformation& info, WRWorkDaemon* daemon, const QHostAddress& addr, WR16u port, bool autostart = true);
    //清理当前对象所占用的相关资源。
    ~WRWorkTcpCommDomain();

    //获取服务地址。
    inline const QHostAddress& addr(void) const
    {
        return m_addr;
    }
    //获取服务端口。
    inline WR16u port(void) const
    {
        return m_port;
    }

    //启动工作域。
    virtual bool start(void) override;
    //关闭工作域。
    virtual void close(void) override;
};

#endif // WRWORKTCPCOMMDOMAIN

